from django.db import models

# Create your models here.


class College(models.Model):
    """
        定义一个 College 类，表示一个学院

        属性:
            college_name：学院的名称

        方法:
            __str__：返回学院名称的字符串表示
        """
    class Meta:
        verbose_name = '学院'
        verbose_name_plural = verbose_name
    college_name = models.CharField(max_length=100,verbose_name='学院名称')

    def __str__(self):
        return self.college_name


class Major(models.Model):
    """
      定义一个 Major 类，表示一个专业

      属性:
          major_name：专业的名称
          college：专业所属的学院

      方法:
          __str__：返回专业名称的字符串表示
      """
    class Meta:
        verbose_name = '专业'
        verbose_name_plural = verbose_name

    major_name = models.CharField(max_length=100, verbose_name='专业名称')
    college = models.ForeignKey(College, on_delete=models.CASCADE,verbose_name='所属学院')

    def __str__(self):
        return self.major_name


class Classroom(models.Model):
    """
        定义一个 Classroom 类，表示一个教室

        属性:
            location：教室的位置
            capacity：教室的容量

        方法:
            __str__：返回教室位置的字符串表示
        """
    class Meta:
        verbose_name = '教室'
        verbose_name_plural = verbose_name

    location = models.CharField(max_length=100)
    capacity = models.IntegerField()

    def __str__(self):
        return self.location


class Teacher(models.Model):
    """
        定义一个 Teacher 类，表示一名教师

        属性:
            name：教师的姓名
            major：教师所属的专业

        方法:
            __str__：返回教师姓名的字符串表示
        """
    class Meta:
        verbose_name = '教师'
        verbose_name_plural = verbose_name
    # teacher_id = models.CharField(max_length=20, primary_key=True,verbose_name='工号')
    name = models.CharField(max_length=100,verbose_name='姓名')
    major = models.ForeignKey(Major, on_delete=models.CASCADE,verbose_name='专业')

    def __str__(self):
        return self.name


class Class(models.Model):
    """
        定义一个 Class 类，表示一个班级

        属性:
            class_name：班级的名称
            head_teacher：班级的班主任，外键关联到 Teacher 类

        方法:
            __str__：返回班级名称的字符串表示
        """
    class Meta:
        verbose_name = '班级'
        verbose_name_plural = verbose_name
    class_name = models.CharField(max_length=100,verbose_name='班级名称')
    head_teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE,verbose_name='班主任')

    def __str__(self):
        return self.class_name


class Student(models.Model):
    """
        表示一个学生的模型。

        属性:
            student_id (str): 学生的ID，作为主键，最大长度为20。
            name (str): 学生的姓名，最大长度为100。
            class_id (Class): 学生所属的班级，外键关联到 Class 类，当班级被删除时，级联删除学生。
            major_id (Major): 学生所属的专业，外键关联到 Major 类，当专业被删除时，级联删除学生。

        方法:
            __str__: 返回学生姓名的字符串表示。
        """
    class Meta:
        verbose_name = '学生'
        verbose_name_plural = verbose_name
    GENDER_CHOICES = [
        ('1', '男性'),
        ('2', '女性')
    ]
    student_id = models.CharField(max_length=20, primary_key=True,verbose_name='学号')
    img=models.ImageField(upload_to='images/',verbose_name='头像',blank=True,null=True)
    name = models.CharField(max_length=100,verbose_name='姓名')
    gender = models.CharField(max_length=10, choices=GENDER_CHOICES,verbose_name='性别')
    age = models.IntegerField(verbose_name='年龄')
    email = models.EmailField(verbose_name='邮箱')
    phone = models.CharField(max_length=15,verbose_name='电话')
    address = models.TextField(verbose_name='地址')
    created_at = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
    updated_at = models.DateTimeField(auto_now=True,verbose_name='更新时间')
    class_id = models.ForeignKey(Class, on_delete=models.CASCADE,verbose_name='班级')
    major_id = models.ForeignKey(Major, on_delete=models.CASCADE,verbose_name='专业')

    def __str__(self):
        return self.name


class Course(models.Model):
    """
        表示一个课程的模型。

        属性:
            course_id (str): 课程的ID，作为主键，最大长度为20。
            course_name (str): 课程的名称，最大长度为100。
            credits (int): 课程的学分。

        方法:
            __str__: 返回课程名称的字符串表示。
        """
    class Meta:
        verbose_name = '课程'
        verbose_name_plural = verbose_name
    course_id = models.CharField(max_length=20, primary_key=True,verbose_name='课程号')
    course_name = models.CharField(max_length=100,verbose_name='课程名称')
    credits = models.IntegerField(verbose_name='学分')

    def __str__(self):
        return self.course_name


class Grade(models.Model):
    """
        表示一个成绩的模型。

        属性:
            grade_id (int): 成绩的ID，作为主键，自增。
            student (Student): 学生，外键关联到 Student 类，当学生被删除时，级联删除成绩。
            course (Course): 课程，外键关联到 Course 类，当课程被删除时，级联删除成绩。
            score (float): 成绩。

        方法:
            __str__: 返回学生和课程的字符串表示。
        """
    class Meta:
        verbose_name = '成绩'
        verbose_name_plural = verbose_name
    grade_id = models.AutoField(primary_key=True,verbose_name='课程ID')
    student = models.ForeignKey(Student, on_delete=models.CASCADE, verbose_name='学生')
    course = models.ForeignKey(Course, on_delete=models.CASCADE ,verbose_name='课程')
    score = models.FloatField(verbose_name='成绩')

    def __str__(self):
        return f"{self.student} - {self.course}"
